home *** CD-ROM | disk | FTP | other *** search
/ Trusted Irix /B 4.0.4 / Trusted-Irix B-4.0.1.iso / dist / eoe1.idb / usr / include / sys / scsidev.h.z / scsidev.h
C/C++ Source or Header  |  1992-04-03  |  9KB  |  187 lines

  1. /**************************************************************************
  2.  *                                      *
  3.  *          Copyright (C) 1986, Silicon Graphics, Inc.          *
  4.  *                                      *
  5.  *  These coded instructions, statements, and computer programs  contain  *
  6.  *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
  7.  *  are protected by Federal copyright law.  They  may  not be disclosed  *
  8.  *  to  third  parties  or copied or duplicated in any form, in whole or  *
  9.  *  in part, without the prior written consent of Silicon Graphics, Inc.  *
  10.  *                                      *
  11.  **************************************************************************/
  12.  
  13. #ident "$Revision: 3.27 $"
  14.  
  15. /*
  16.  * SCSI command interface internal data structures.
  17.  */
  18.  
  19. #define    PSCSI        PZERO-1
  20.  
  21. #define    MAXWAIT        4000000    /* Max wait for non-timeout IO
  22.                        operations */
  23. #define        SC_MAXRETRY    4    /* Max number of retries on
  24.                        parity errs */
  25.  
  26. typedef struct scsidev        scsidev_t;
  27.  
  28.  
  29. /*
  30.  * Host adapter interface record.  Records our state, his info, any
  31.  * other nits needed to properly run the adapter.  Could be generalized
  32.  * by adding a different kind of structure for each device
  33.  */
  34. struct scsidev {
  35.     u_char d_flags;    /* Flags, see below */
  36.     u_char d_ctrlreg;    /* value to put in ctrl register */
  37.     u_char d_tdata;    /* temporary holder for data reg on some intr */
  38.     u_char d_adap;    /* controller # */
  39.     u_char d_ucode;    /* ucode revision; 93B only */
  40.     struct dmamap    *d_map;        /* DMA map */
  41.     scsisubchan_t    *d_consubchan;    /* Connected subchannel */
  42.     u_int        d_retry;    /* Retry count */
  43.     scsisubchan_t    *d_subchan[SC_MAXTARG][SC_MAXLU];
  44.                     /* Table of subchannels */
  45.     scsisubchan_t    *d_waithead;    /* Async request waitint list head */
  46.     scsisubchan_t    *d_waittail;    /* Async request waitint list tail */
  47.     sema_t        d_sleepsem;    /* Synchronous request waiting sem */
  48.     sema_t        d_onlysem;    /* 'only' request waiting sem */
  49.     short        d_sleepcount;    /* Synchronous request waiter count */
  50.     short        d_onlycount;    /* Synchronous request waiter count */
  51.     lock_t        d_qlock;    /* Lock for structure flags & queues */
  52.     lock_t        d_reglock;    /* Lock for hardware registers */
  53.     volatile u_char    *d_addr;    /* chip address register */
  54.     volatile u_char    *d_data;    /* chip 'data' register */
  55. };
  56.  
  57. #define    D_BUSY    0x1    /* host adapter in use */
  58. #define D_WD93    0x2    /* is a 93, don't try burst mode dma, etc. */
  59. #define D_WD93A    0x4    /* is a 93A, so we can use burst mode dma */
  60. #define D_WD93B    0x8    /* is a 93B, superset of 93A, fast scsi, queues, etc. */
  61. #define D_ONLY    0x10    /* only onlysem waiters can acquire */
  62. #define D_MAPRETAIN 0x20 /*Set via scuzzy struct d_initflags for systems
  63.              * where the DMA map retained across disconnects;
  64.              * i.e., a DMA MAP per SCSI channel in use */
  65. #define D_PROMSYNC 0x40 /* Set via scuzzy struct d_initflags for systems
  66.              * whose PROM understands sync scsi */
  67.  
  68. /* Chip registers.  */
  69. #define    WD93ID        0    /* own id register */
  70. #define    WD93CTRL    1    /* control register */
  71. #define    WD93TOUT    2    /* timeout register */
  72. #define    WD93C1        3    /* command byte 1 */
  73. #define    WD93C2        4    /* command byte 1 */
  74. #define    WD93C3        5    /* command byte 1 */
  75. #define    WD93C4        6    /* command byte 1 */
  76. #define    WD93C5        7    /* command byte 1 */
  77. #define    WD93C6        8    /* command byte 1 */
  78. #define    WD93C7        9    /* command byte 1 */
  79. #define    WD93C8        10    /* command byte 1 */
  80. #define    WD93C9        11    /* command byte 1 */
  81. #define    WD93C10        12    /* command byte 1 */
  82. #define    WD93C11        13    /* command byte 1 */
  83. #define    WD93C12        14    /* command byte 1 */
  84. #define    WD93LUN        15    /* target LUN */
  85. #define    WD93PHASE    16    /* command phase */
  86. #define    WD93SYNC    17    /* synchronous transfer */
  87. #define    WD93CNTHI    18    /* MSB transfer count */
  88. #define    WD93CNTMD    19    /* transfer count */
  89. #define    WD93CNTLO    20    /* LSB transfer count */
  90. #define    WD93DESTID    21    /* destination ID */
  91. #define    WD93SRCID    22    /* source ID */
  92. #define    WD93STAT    23    /* SCSI Status */
  93. #define    WD93CMD        24    /* command register */
  94. #define    WD93DATA    25    /* data register */
  95. #define    WD93QTAG    26    /* queue tag register (93B only) */
  96.  
  97. /* Timeout values.  */
  98. #ifdef IP12    /* runs at 20 Mhz */
  99. #define    T93SATN        64    /* ~250 ms @ 4 ms per tick (for 20MHz) */
  100. #define    T93SATN_SHORT     8    /*  ~30 ms during hinv and diags */
  101. #define WD93FREQVAL    0x80    /* bit for chip frequency (ORed into 93ID) */
  102. #else    /* all others run at 10 MHz */
  103. #define    T93SATN        32    /* ~250 ms @ 8 ms per tick (for 10MHz) */
  104. #define    T93SATN_SHORT     4    /*  ~30 ms during hinv and diags */
  105. #define WD93FREQVAL    0    /* bit for chip frequency (ORed into 93ID) */
  106. #endif    /* IP12 */
  107.  
  108. #define    T93SRETRY    3    /* times to attempt selection; same as most
  109.     drives will do on re-selects. */
  110.  
  111. /* Chip commands.  */
  112. #define    C93RESET    0x00    /* reset the bus and chip */
  113. #define    C93ABORT    0x01    /* abort current operation */
  114. #define    C93ATN        0x02    /* assert ATN on the bus */
  115. #define    C93NACK        0x03    /* negate ACK line */
  116. #define    C93DISC        0x04    /* disconnect from bus */
  117. #define    C93RESEL    0x05    /* reselect */
  118. #define    C93SELATN    0x06    /* select with ATN */
  119. #define    C93SELNATN    0x07    /* select with no ATN */
  120. #define    C93SELATNTR    0x08    /* select with ATN and transfer */
  121. #define    C93SELNATNTR    0x09    /* select without ATN and transfer */
  122. #define    C93RESELREC    0x0a    /* reselect and receive */
  123. #define    C93RESELSND    0x0b    /* reselect and send */
  124. #define    C93WSELREC    0x0c    /* wait for select and receive */
  125. #define    C93SENDMSG    0x16    /* send message to target */
  126. #define    C93TRADDR    0x18    /* translate address */
  127. #define    C93TRINFO    0x20    /* transfer info */
  128. #define    C93TRPAD    0x21    /* transfer pad */
  129.  
  130. /* States of interest */
  131. #define    ST_RESET    0x00    /* Reset by command or power-up (MR-) */
  132. #define    ST_SELECT    0x11    /* Selection complete (after C93SELATN) */
  133. #define    ST_SATOK    0x16    /* Select-And-Transfer completed successfully */
  134. #define ST_TR_DATAOUT    0x18    /* transfer cmd done, target requesting data */
  135. #define ST_TR_DATAIN    0x19    /* transfer cmd done, target sending data */
  136. #define    ST_TR_STATIN    0x1b    /* Target is sending status in */
  137. #define ST_TR_MSGIN    0x1f    /* transfer cmd done, target sending msg */
  138. #define ST_TRANPAUSE    0x20    /* transfer cmd has paused with ACK */
  139. #define    ST_SAVEDP    0x21    /* Save Data Pointers message during SAT */
  140. #define    ST_A_RESELECT    0x27    /* reselected after disc (93A) */
  141. #define    ST_UNEXPDISC    0x41    /* An unexpected disconnect */
  142. #define    ST_PARITY    0x43    /* cmd terminated due to parity error */
  143. #define    ST_PARITY_ATN    0x44    /* cmd terminated due to parity error
  144.     (ATN is asserted) */
  145. #define    ST_TIMEOUT    0x42    /* Time-out during Select or Reselect */
  146. #define    ST_INCORR_DATA    0x47    /* incorrect message or status byte */
  147. #define    ST_UNEX_RDATA    0x48    /* Unexpected receive data phase */
  148. #define    ST_UNEX_SDATA    0x49    /* Unexpected send data phase */
  149. #define    ST_UNEX_CMDPH    0x4a    /* Unexpected cmd phase */
  150. #define    ST_UNEX_SSTATUS    0x4b    /* Unexpected send status phase */
  151. #define    ST_UNEX_RMESGOUT    0x4e    /* Unexpected request msg out phase */
  152. #define    ST_UNEX_SMESGIN    0x4f    /* Unexpected send message in phase */
  153. #define    ST_RESELECT    0x80    /* WD33C93 has been reselected */
  154. #define    ST_93A_RESEL    0x81    /* reselected while idle (93A) */
  155. #define    ST_DISCONNECT    0x85    /* Disconnect has occurred */
  156. #define ST_NEEDCMD    0x8a    /* Target is ready for a cmd */
  157. #define    ST_REQ_SMESGOUT    0x8e    /* REQ signal for send message out */
  158. #define    ST_REQ_SMESGIN    0x8f    /* REQ signal for send message in */
  159.  
  160. /* Phases during a Select and Transfer command */
  161. #define    PH_NOSELECT    0x00    /* Selection not successful */
  162. #define    PH_SELECT    0x10    /* Selection successful */
  163. #define    PH_IDENTSEND    0x20    /* Identify message sent */
  164. /* phase 30 indicates none of the cmd bytes have yet been sent; every
  165.  * cmd byte sent increments that by one. */
  166. #define    PH_CDB_START    0x30    /* Start of CDC transfers */
  167. #define    PH_CDB_6    0x36    /* 6th cmd byte sent */
  168. #define    PH_CDB_10    0x3a    /* 0xAth cmd byte sent */
  169. #define    PH_CDB_12    0x3c    /* 0xCth cmd byte sent */
  170. #define    PH_SAVEDP    0x41    /* Save data pointers */
  171. #define    PH_DISCRECV    0x42    /* Disconnect message received */
  172. #define    PH_DISCONNECT    0x43    /* Target disconnected */
  173. #define    PH_RESELECT    0x44    /* Original target reselected */
  174. #define    PH_IDENTRECV    0x45    /* Correct identify (right LUN) message rcv'd */
  175. #define    PH_DATA        0x46    /* Data transfer completed */
  176. #define    PH_STATUSRECV    0x50    /* Status byte received */
  177. #define    PH_COMPLETE    0x60    /* Command complete message received */
  178.  
  179. /* Auxiliary status register bits */
  180. #define    AUX_INT        0x80    /* interrupt pending */
  181. #define    AUX_LCI        0x40    /* last command ignored */
  182. #define    AUX_BSY        0x20    /* busy -- level II command being performed */
  183. #define    AUX_CIP        0x10    /* command in progress */
  184. #define    AUX_PE        0x02    /* parity error */
  185. #define    AUX_DBR        0x01    /* data buffer ready */
  186.  
  187.